{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Coding Exercise: Domain Adaption Meta Learning\n",
    "\n",
    "For this tutorial, we will be showcasing use of Domain Adaption Meta Learning, to learn a simple curve of sinusoidal data. It's a variation of 'Model Agnostic Meta Learning', but with added prior information i.e; extra relevant information about domain is already added.\n",
    "\n",
    "Let's Begin!!!!\n",
    "\n",
    "Meta-learning algorithms optimize the ability of models to learn new tasks quickly. To do so, they use data collected across a wide range of tasks and are evaluated based on their ability to learn new meta-test tasks. This process can be formalized as learning a prior(extract important information) over data(range of tasks), and the fine-tuning process becomes the inference under the learned prior. [Source, DAML paper]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "<img src=\"Images/DAML.png\" width=\"500\"/>\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 1: Import all libraries "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import math\n",
    "import random\n",
    "import sys\n",
    "import torch # v0.4.1\n",
    "from torch import nn\n",
    "from torch.nn import functional as F\n",
    "from tqdm import tqdm\n",
    "from time import sleep\n",
    "import matplotlib as mpl\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 2: Create a simple neural network architecture, which is going to learn the sinusoidal curve.\n",
    "As mentioned above, we will be getting randomly generated data of sinusoidal curve so, we will be using this very small network, as we don't need a big one to learn a curve."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def meta_net(x, params): \n",
    "    # main network which is suppose to learn our main objective i.e; learn sinusoidal curve family here.\n",
    "    x = F.linear(x, params[0], params[1])\n",
    "    x1 = F.relu(x)\n",
    "\n",
    "    x = F.linear(x1, params[2], params[3])\n",
    "    x2 = F.relu(x)\n",
    "\n",
    "    y = F.linear(x2, params[4], params[5])\n",
    "\n",
    "    return y, x2, x1\n",
    "\n",
    "params = [\n",
    "    torch.Tensor(32, 1).uniform_(-1., 1.).requires_grad_(),\n",
    "    torch.Tensor(32).zero_().requires_grad_(),\n",
    "\n",
    "    torch.Tensor(32, 32).uniform_(-1./math.sqrt(32), 1./math.sqrt(32)).requires_grad_(),\n",
    "    torch.Tensor(32).zero_().requires_grad_(),\n",
    "\n",
    "    torch.Tensor(1, 32).uniform_(-1./math.sqrt(32), 1./math.sqrt(32)).requires_grad_(),\n",
    "    torch.Tensor(1).zero_().requires_grad_(),\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Step 3: Create another simple neural network architecture, for collecting and adding prior information about domain.\n",
    "As mentioned above, we will be adding a prior knowledge to our main net. Therefore, we need to create a simple adap_net."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "def adap_net(y, x2, x1, params): \n",
    "    # the net takes forward pass from meta_net and provides efficient parameter initializations i.e;\n",
    "    # It works adapts the meta_net easily to any form of change\n",
    "    \n",
    "    x = torch.cat([y, x2, x1], dim=1)\n",
    "\n",
    "    x = F.linear(x, params[0], params[1])\n",
    "    x = F.relu(x)\n",
    "\n",
    "    x = F.linear(x, params[2], params[3])\n",
    "    x = F.relu(x)\n",
    "\n",
    "    x = F.linear(x, params[4], params[5])\n",
    "\n",
    "    return x\n",
    "\n",
    "adap_params = [\n",
    "    torch.Tensor(32, 1+32+32).uniform_(-1./math.sqrt(65), 1./math.sqrt(65)).requires_grad_(),\n",
    "    torch.Tensor(32).zero_().requires_grad_(),\n",
    "\n",
    "    torch.Tensor(32, 32).uniform_(-1./math.sqrt(32), 1./math.sqrt(32)).requires_grad_(),\n",
    "    torch.Tensor(32).zero_().requires_grad_(),\n",
    "\n",
    "    torch.Tensor(1, 32).uniform_(-1./math.sqrt(32), 1./math.sqrt(32)).requires_grad_(),\n",
    "    torch.Tensor(1).zero_().requires_grad_(),\n",
    "]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### step 4: set up parameters for training\n",
    "so as we are going to use inner loop vs outer loop training as mentioned in DAML paper. thus, we need to set certain parameters such as alpha, beta, learning rate, optimizer, and number of loops. "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "opt = torch.optim.SGD(params + adap_params, lr=1e-2)\n",
    "n_inner_loop = 5\n",
    "alpha = 3e-2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 5: Implement Optimization Algorithm \n",
    "As mentioned in paper, this approach can learn new skill from only one video of a human. For this, it first trains to build a strong and rich prior over tasks during a meta-training phase, using both human demonstrations and teleoperated demonstrations are available.\n",
    "\n",
    "In this phase, the robot(meta_net) learns \"how to learn from humans\" using data. After the meta-training phase, the robot can acquire new skills by combining its learned prior knowledge with one video of a human performing the new skill.\n",
    "\n",
    "\n",
    "This approach consists of two phases. \n",
    "(i) In the metatraining phase, the goal will be to acquire a prior over policies(phi) using both human and robot demonstration data.\n",
    "\n",
    "(ii) Use learned prior to quickly learn to imitate new tasks with only few data points. "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "Note: adap_net works something similar to lstm meta learner, it provides info for main network in terms of parameters to converge faster and better. It provides new parameters after parsing through data.\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "100%|██████████| 100000/100000 [12:45<00:00, 130.68it/s]\n"
     ]
    }
   ],
   "source": [
    "inner_loop_loss=[]\n",
    "outer_lopp_loss=[]\n",
    "\n",
    "# Here, T ∼ p(T ) {or minibatch of tasks} is to learn sinusoidal family curves\n",
    "\n",
    "with tqdm(total=100000, file=sys.stdout) as pbar:\n",
    "    for it in range(100000):\n",
    "        b = 0 if random.choice([True, False]) else math.pi\n",
    "        #### Randomly obtain the task 2 sinusoidal data ####\n",
    "        \n",
    "        # Sample robotic task data d_r~D_r\n",
    "        v_x = torch.rand(4, 1)*4*math.pi - 2*math.pi \n",
    "        v_y = torch.sin(v_x + b)\n",
    "\n",
    "        opt.zero_grad()\n",
    "\n",
    "        new_params = params\n",
    "        for k in range(n_inner_loop):\n",
    "            # Sample Human task data d_h~D_h\n",
    "            sampled_data = torch.FloatTensor([[random.uniform(math.pi/4, math.pi/2) \n",
    "                                               if b == 0 else random.uniform(-math.pi/2, -math.pi/4)]])\n",
    "            \n",
    "            # Here, si is adap_net parameters: adap_params and theta is meta_net parameters: new_params\n",
    "            f, f2, f1 = meta_net(sampled_data, new_params) \n",
    "            h = adap_net(f, f2, f1, adap_params)\n",
    "            \n",
    "             # calculate loss\n",
    "            adap_loss = F.l1_loss(h, torch.zeros(1, 1))\n",
    "            grads = torch.autograd.grad(adap_loss, new_params, create_graph=True)\n",
    "            \n",
    "            # Compute policy parameters phi_t(new_params)\n",
    "            new_params = [(new_params[i] - alpha*grads[i]) for i in range(len(params))]\n",
    "\n",
    "            if it % 100 == 0: \n",
    "                inner_loop_loss.append(adap_loss)\n",
    "\n",
    "        v_f, _, _ = meta_net(v_x, new_params) # forward pass using learned policy parameters phi_t\n",
    "        loss = F.l1_loss(v_f, v_y) # calculate the loss of meta_net\n",
    "        loss.backward()\n",
    "        \n",
    "        opt.step() # optimize the policy parameters(theta and si)\n",
    "        pbar.update(1)\n",
    "        if it % 100 == 0: \n",
    "            outer_lopp_loss.append(loss)\n",
    "            # print ('Iteration %d -- Outer Loss: %.4f' % (it, loss)) \n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "#### Step 5: Fine-tune our main net \n",
    "Once we have obtained right parameters, we will first generate some random data points to sub-sample 5 data points, and fine-tune main 'meta_net' using loss of adap_net. \n",
    "\n",
    "When deployed, the robot can adapt to a particular task with novel objects using just a single video of a human performing the task with those objects"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "t_b = math.pi\n",
    "opt.zero_grad()\n",
    "t_params = params\n",
    "\n",
    "for k in range(n_inner_loop):\n",
    "    # sample the new task data\n",
    "    new_task_data = torch.FloatTensor([[random.uniform(math.pi/4, math.pi/2)\n",
    "                                        if t_b == 0 else random.uniform(-math.pi/2, -math.pi/4)]])\n",
    "    # forward pass through meta_net to extract the input for adap_net\n",
    "    t_f, t_f2, t_f1 = meta_net(new_task_data, t_params)\n",
    "    # extract the information from adap_net\n",
    "    t_h = adap_net(t_f, t_f2, t_f1, adap_params)\n",
    "    # calculate the loss, here we used true label as torch.zeros(1, 1), because t_b = pi\n",
    "    t_adap_loss = F.l1_loss(t_h, torch.zeros(1, 1))\n",
    "\n",
    "    grads = torch.autograd.grad(t_adap_loss, t_params, create_graph=True)\n",
    "    # learn the policy using the loss of adap_net\n",
    "    t_params = [(t_params[i] - alpha*grads[i]) for i in range(len(params))]"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "##### Step 6: Visualize outputs "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x130d03b70>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "test_x = torch.arange(-2*math.pi, 2*math.pi, step=0.01).unsqueeze(1)\n",
    "test_y = torch.sin(test_x + t_b)\n",
    "\n",
    "test_f, _, _ = meta_net(test_x, t_params) # use the learned parameters\n",
    "\n",
    "plt.plot(test_x.data.numpy(), test_y.data.numpy(), label='sin(x)')\n",
    "plt.plot(test_x.data.numpy(), test_f.data.numpy(), label='meta_net(x)')\n",
    "plt.legend()\n",
    "plt.savefig('daml-sine.png')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXcAAAD8CAYAAACMwORRAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJztnXl4FFXWxt/TnYSw73uABAighE0Q\nRARBVFBn3Ndxn3HXcdcPd2Xct9GZUdFxGxVFcQMEwQ1wg8giIDshBBK2hLCGkK37fn9UV3dVda3d\n1el09/k9Dw/dVbdu3eruvHXq3HPPISEEGIZhmOTCE+8BMAzDMO7D4s4wDJOEsLgzDMMkISzuDMMw\nSQiLO8MwTBLC4s4wDJOEsLgzDMMkISzuDMMwSQiLO8MwTBKSFq8Tt2vXTmRnZ8fr9AzDMAnJsmXL\n9ggh2lu1i5u4Z2dnY+nSpfE6PcMwTEJCRFvttGO3DMMwTBLC4s4wDJOEsLgzDMMkIXHzuTMMk5jU\n1taipKQEVVVV8R5KUpOZmYmsrCykp6dHdDyLO8MwjigpKUHz5s2RnZ0NIor3cJISIQTKy8tRUlKC\nnJyciPqwdMsQ0dtEVEpEqw32ExH9i4gKiGgVER0T0UgYhkkIqqqq0LZtWxb2GEJEaNu2bVRPR3Z8\n7u8CmGiy/zQAuYF/1wF4LeLRMAyTELCwx55oP2NLcRdC/Ahgr0mTswC8JyQWA2hFRJ2jGpVN5q3Z\nhdJD7PdjGIbR4ka0TFcAxYr3JYFtMaWq1ofr31+Gy9/8LdanYhimgdGsWbOYn6OiogLXX389evXq\nhf79+2PMmDHIz8+P+Xndwo0JVb1nB92q20R0HSTXDbp37x7VSX1+6RTb9lZG1Q/DMIwe11xzDXJy\ncrBp0yZ4PB4UFhZi3bp1to+vq6tDWlr8YlbcsNxLAHRTvM8CsEOvoRDiDSHEMCHEsPbtLVMjmMIu\nP4ZhlGzduhXjx4/HwIEDMX78eGzbtg0AMH36dOTl5WHQoEEYM2YMAGDNmjUYPnw4Bg8ejIEDB2LT\npk2qvjZv3oz8/Hw8/vjj8HgkmezZsyfOOOMMFBUVIS8vL9j2+eefx6OPPgoAGDt2LO6//36ceOKJ\neOKJJ5CdnQ2/3w8AqKysRLdu3VBbW4vNmzdj4sSJGDp0KEaPHo3169e7/nm4cVuZCeAWIpoGYASA\nA0KInS70a4rQfTZgGKY+eWzWGqzdcdDVPo/u0gKP/Lm/4+NuueUWXHHFFbjyyivx9ttv49Zbb8WX\nX36JyZMnY968eejatSv2798PAJgyZQpuu+02XHrppaipqYHP51P1tWbNGgwePBher9fxOPbv34+F\nCxcCAJYvX46FCxdi3LhxmDVrFiZMmID09HRcd911mDJlCnJzc5Gfn4+bbroJP/zwg+NzmWEp7kT0\nEYCxANoRUQmARwCkA4AQYgqAOQBOB1AAoBLA1a6O0HJ89Xk2hmEaKosWLcLnn38OALj88stx7733\nAgBGjRqFq666ChdeeCHOPfdcAMDIkSPxxBNPoKSkBOeeey5yc3NdG8dFF12kev3xxx9j3LhxmDZt\nGm666SZUVFTg119/xQUXXBBsV11d7dr5ZSzFXQhxicV+AeBm10ZkE9lwZwueYeJHJBZ2fSGHEk6Z\nMgX5+fmYPXs2Bg8ejBUrVuAvf/kLRowYgdmzZ2PChAl48803cdJJJwWP7d+/P1auXAm/3x90y8ik\npaUFXS0AwmLRmzZtGnx95pln4r777sPevXuxbNkynHTSSTh8+DBatWqFFStWxOKygyRsbhk/qzrD\nMAqOP/54TJs2DQAwdepUnHDCCQAk//mIESMwefJktGvXDsXFxSgsLETPnj1x66234swzz8SqVatU\nffXq1QvDhg3DI488AhHQmk2bNmHGjBno2LEjSktLUV5ejurqanz11VeGY2rWrBmGDx+O2267DX/6\n05/g9XrRokUL5OTkYPr06QCk1agrV650/fNIWHGXtd1tt0x5RTXe/Kkw+IUmMkIIfLNmF+p8fuvG\nDJNAVFZWIisrK/jvxRdfxL/+9S+88847GDhwIN5//328/PLLAIB77rkHAwYMQF5eHsaMGYNBgwbh\n448/Rl5eHgYPHoz169fjiiuuCDvHm2++iV27dqF3794YMGAArr32WnTp0gXp6el4+OGHMWLECPzp\nT39Cv379TMd60UUX4YMPPlC5a6ZOnYq33noLgwYNQv/+/TFjxgx3PyAAFC8RGzZsmIimWMeByloM\nmvwNmmR4sXay2QJaZ1z59m9YuLEMM28ZhYFZrVzrNx7MXb0LN3ywDPdM6Iubx/WO93CYJGHdunU4\n6qij4j2MlEDvsyaiZUKIYVbHJqzlbuWW+fqPndh90Pnq1YNVtQCAWl/93PT2V9agpi42lnVZYPXu\n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\nSUL+H12Bt+pL3o0SAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x130cff7f0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "def plot_loss(inner_loop_loss,name=\"Loss Curve\"):\n",
    "    plt.plot(inner_loop_loss, label=name)\n",
    "    plt.legend()\n",
    "plot_loss(outer_lopp_loss)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
